package query

import (
	"jlpay-sdk-go/pkg/jlpay/core"
	"jlpay-sdk-go/pkg/jlpay/models"
)

// ==================== 商户基本信息查询 ====================

// MerchBaseInfoQueryRequest 商户基本信息查询请求
type MerchBaseInfoQueryRequest struct {
	models.OrgBaseRequest
	// MerchNo 商户号
	MerchNo string `json:"merch_no,omitempty"`
	// 原始请求映射数据
	rawRequestMap map[string]interface{} `json:"-"`
}

// NewMerchBaseInfoQueryRequest 创建商户基本信息查询请求
func NewMerchBaseInfoQueryRequest() *MerchBaseInfoQueryRequest {
	req := &MerchBaseInfoQueryRequest{}
	return req
}

// SetMerchNo 设置商户号
func (r *MerchBaseInfoQueryRequest) SetMerchNo(merchNo string) *MerchBaseInfoQueryRequest {
	r.MerchNo = merchNo
	return r
}

// SetRawRequestMap 设置原始请求映射数据
func (r *MerchBaseInfoQueryRequest) SetRawRequestMap(rawMap map[string]interface{}) *MerchBaseInfoQueryRequest {
	r.rawRequestMap = rawMap
	return r
}

// GetRawMap 获取原始请求映射数据
func (r *MerchBaseInfoQueryRequest) GetRawMap() (map[string]interface{}, bool) {
	return r.rawRequestMap, len(r.rawRequestMap) > 0
}

// ToMap 转换为map
func (r *MerchBaseInfoQueryRequest) ToMap() (map[string]interface{}, error) {
	// 如果有原始请求数据，优先使用
	if rawMap, hasRaw := r.GetRawMap(); hasRaw {
		return rawMap, nil
	}

	// 先获取基类的map
	baseMap, err := r.OrgBaseRequest.ToMap()
	if err != nil {
		return nil, err
	}

	// 添加自己的字段
	if r.MerchNo != "" {
		baseMap["merch_no"] = r.MerchNo
	}

	return baseMap, nil
}

// CheckRequiredParams 检查必需参数
func (r *MerchBaseInfoQueryRequest) CheckRequiredParams(config *core.Config) error {
	// 与Python版本保持一致，不进行参数校验
	return nil
}

// RateInfoDto 费率信息
type RateInfoDto struct {
	// FeeType 费率类型
	FeeType string `json:"fee_type,omitempty"`
	// FeeRate 费率值
	FeeRate string `json:"fee_rate,omitempty"`
}

// NewRateInfoDto 创建费率信息
func NewRateInfoDto() *RateInfoDto {
	return &RateInfoDto{}
}

// ToMap 转换为map
func (r *RateInfoDto) ToMap() map[string]interface{} {
	result := make(map[string]interface{})

	if r.FeeType != "" {
		result["fee_type"] = r.FeeType
	}
	if r.FeeRate != "" {
		result["fee_rate"] = r.FeeRate
	}

	return result
}

// MerchBaseInfoQueryResponse 商户基本信息查询响应
type MerchBaseInfoQueryResponse struct {
	models.StandardResponse
	// 基础信息
	MerchNo      string `json:"merch_no,omitempty"`      // 商户号
	MerchName    string `json:"merch_name,omitempty"`    // 商户名称
	RegisterTime string `json:"register_time,omitempty"` // 进件时间
	MerchStatus  string `json:"merch_status,omitempty"`  // 商户状态
	ProductType  string `json:"product_type,omitempty"`  // 产品类型
	SignMode     string `json:"sign_mode,omitempty"`     // 协议类型
	AgentID      string `json:"agent_id,omitempty"`      // 服务商编号

	// 进件结果
	SignID  string `json:"sign_id,omitempty"`  // 协议编号
	SignURL string `json:"sign_url,omitempty"` // 协议链接

	// 经营信息
	MerchShortname   string `json:"merch_shortname,omitempty"`    // 商户经营名称
	MerchEnglishName string `json:"merch_english_name,omitempty"` // 商户英文名称
	AddressCode      string `json:"address_code,omitempty"`       // 经营地址-省市区
	AddressDetail    string `json:"address_detail,omitempty"`     // 经营地址-详细地址
	MccCode          string `json:"mcc_code,omitempty"`           // 所属行业

	// 结算设置
	SettleMode        string         `json:"settle_mode,omitempty"`         // 结算方式
	DayCut            string         `json:"day_cut,omitempty"`             // 营业周期
	AccountChangeFlag string         `json:"account_change_flag,omitempty"` // 是否允许商户自主变更结算账户
	Postscript        string         `json:"postscript,omitempty"`          // 结算附言
	RateInfo          []*RateInfoDto `json:"rate_info,omitempty"`           // 费率列表

	// 辅助证明材料
	BankServerID string `json:"bank_server_id,omitempty"` // 银行客户经理工号
	BankCode     string `json:"bank_code,omitempty"`      // 银行编号

	// 身份信息
	MerchType string `json:"merch_type,omitempty"` // 主体类型

	// 营业证明信息
	LicenseType    string `json:"license_type,omitempty"`    // 执照类型
	LicenseNo      string `json:"license_no,omitempty"`      // 注册号/统一社会信用代码
	CertNumber     string `json:"cert_number,omitempty"`     // 登记证书编号
	LicenseName    string `json:"license_name,omitempty"`    // 商户法定名称
	BusinessScope  string `json:"business_scope,omitempty"`  // 经营范围
	LicenseAddress string `json:"license_address,omitempty"` // 注册地址
	PeriodBegin    string `json:"period_begin,omitempty"`    // 有效期限开始日期
	PeriodEnd      string `json:"period_end,omitempty"`      // 有效期限结束日期

	// 经营者/法人信息
	IdDocType         string `json:"id_doc_type,omitempty"`          // 证件类型
	IdCardName        string `json:"id_card_name,omitempty"`         // 经营者/法人姓名 (需要解密)
	IdCardEnglishName string `json:"id_card_english_name,omitempty"` // 经营者/法人英文名称 (需要解密)
	IdCardNo          string `json:"id_card_no,omitempty"`           // 经营者/法人证件号码 (需要解密)
	LegalPersonName   string `json:"legal_person_name,omitempty"`    // 法人姓名 (需要解密)
	LegalPersonPhone  string `json:"legal_person_phone,omitempty"`   // 经营者/法人手机号码 (需要解密)
	CardPeriodBegin   string `json:"card_period_begin,omitempty"`    // 证件有效期开始时间
	CardPeriodEnd     string `json:"card_period_end,omitempty"`      // 证件有效期结束时间

	// 敏感字段列表（用于解密）
	sensitiveFields []string `json:"-"`
	// 原始响应数据
	rawData map[string]interface{} `json:"-"`
}

// NewMerchBaseInfoQueryResponse 创建商户基本信息查询响应
func NewMerchBaseInfoQueryResponse() *MerchBaseInfoQueryResponse {
	return &MerchBaseInfoQueryResponse{
		// 初始化敏感字段列表（使用结构体字段名）
		sensitiveFields: []string{
			"IdCardName",        // 经营者/法人姓名
			"IdCardEnglishName", // 经营者/法人英文名称
			"IdCardNo",          // 经营者/法人证件号码
			"LegalPersonName",   // 法人姓名
			"LegalPersonPhone",  // 经营者/法人手机号码
		},
		RateInfo: make([]*RateInfoDto, 0),
	}
}

// GetSensitiveFields 获取敏感字段列表
func (r *MerchBaseInfoQueryResponse) GetSensitiveFields() []string {
	return r.sensitiveFields
}

// SetSensitiveFields 设置敏感字段列表
func (r *MerchBaseInfoQueryResponse) SetSensitiveFields(fields []string) {
	r.sensitiveFields = fields
}

// GetRawData 获取原始响应数据
func (r *MerchBaseInfoQueryResponse) GetRawData() map[string]interface{} {
	return r.rawData
}

// SetRawData 设置原始响应数据
func (r *MerchBaseInfoQueryResponse) SetRawData(rawData map[string]interface{}) {
	r.rawData = rawData
}

// ==================== 商户费率查询 ====================

// MerchFeeQueryRequest 商户费率查询请求
type MerchFeeQueryRequest struct {
	models.OrgBaseRequest
	// MerchNo 商户号
	MerchNo string `json:"merch_no,omitempty"`
	// 原始请求映射数据
	rawRequestMap map[string]interface{} `json:"-"`
}

// NewMerchFeeQueryRequest 创建商户费率查询请求
func NewMerchFeeQueryRequest() *MerchFeeQueryRequest {
	req := &MerchFeeQueryRequest{}
	return req
}

// SetMerchNo 设置商户号
func (r *MerchFeeQueryRequest) SetMerchNo(merchNo string) *MerchFeeQueryRequest {
	r.MerchNo = merchNo
	return r
}

// SetRawRequestMap 设置原始请求映射数据
func (r *MerchFeeQueryRequest) SetRawRequestMap(rawMap map[string]interface{}) *MerchFeeQueryRequest {
	r.rawRequestMap = rawMap
	return r
}

// GetRawMap 获取原始请求映射数据
func (r *MerchFeeQueryRequest) GetRawMap() (map[string]interface{}, bool) {
	return r.rawRequestMap, len(r.rawRequestMap) > 0
}

// ToMap 转换为map
func (r *MerchFeeQueryRequest) ToMap() (map[string]interface{}, error) {
	// 如果有原始请求数据，优先使用
	if rawMap, hasRaw := r.GetRawMap(); hasRaw {
		return rawMap, nil
	}

	// 先获取基类的map
	baseMap, err := r.OrgBaseRequest.ToMap()
	if err != nil {
		return nil, err
	}

	// 添加自己的字段
	if r.MerchNo != "" {
		baseMap["merch_no"] = r.MerchNo
	}

	return baseMap, nil
}

// CheckRequiredParams 检查必需参数
func (r *MerchFeeQueryRequest) CheckRequiredParams(config *core.Config) error {
	// 与Python版本保持一致，不进行参数校验
	return nil
}

// MerchFeeQueryResponse 商户费率查询响应
type MerchFeeQueryResponse struct {
	models.StandardResponse
	// MerchNo 商户号
	MerchNo string `json:"merch_no,omitempty"`
	// RateInfo 费率信息列表
	RateInfo []*RateInfo `json:"rate_info,omitempty"`
}

// RateInfo 费率信息
type RateInfo struct {
	// FeeCalcType 费率计算类型
	FeeCalcType string `json:"fee_calc_type,omitempty"`
	// MinAmt 最小金额
	MinAmt string `json:"min_amt,omitempty"`
	// MaxAmt 最大金额
	MaxAmt string `json:"max_amt,omitempty"`
	// Fixed 固定值
	Fixed string `json:"fixed,omitempty"`
	// Rate 费率
	Rate string `json:"rate,omitempty"`
	// Bottom 下限
	Bottom string `json:"bottom,omitempty"`
	// Top 上限
	Top string `json:"top,omitempty"`
	// Step 步长
	Step string `json:"step,omitempty"`
	// BaseAmount 基础金额
	BaseAmount string `json:"base_amount,omitempty"`
	// BaseFee 基础费用
	BaseFee string `json:"base_fee,omitempty"`
}

// NewRateInfo 创建费率信息
func NewRateInfo() *RateInfo {
	return &RateInfo{}
}

// NewMerchFeeQueryResponse 创建商户费率查询响应
func NewMerchFeeQueryResponse() *MerchFeeQueryResponse {
	return &MerchFeeQueryResponse{
		RateInfo: make([]*RateInfo, 0),
	}
}

// ==================== 商户渠道信息查询 ====================

// MerchChannelInfoQueryRequest 商户渠道信息查询请求
type MerchChannelInfoQueryRequest struct {
	models.OrgBaseRequest
	// MerchNo 商户号
	MerchNo string `json:"merch_no,omitempty"`
	// 原始请求映射数据
	rawRequestMap map[string]interface{} `json:"-"`
}

// NewMerchChannelInfoQueryRequest 创建商户渠道信息查询请求
func NewMerchChannelInfoQueryRequest() *MerchChannelInfoQueryRequest {
	req := &MerchChannelInfoQueryRequest{}
	return req
}

// SetMerchNo 设置商户号
func (r *MerchChannelInfoQueryRequest) SetMerchNo(merchNo string) *MerchChannelInfoQueryRequest {
	r.MerchNo = merchNo
	return r
}

// SetRawRequestMap 设置原始请求映射数据
func (r *MerchChannelInfoQueryRequest) SetRawRequestMap(rawMap map[string]interface{}) *MerchChannelInfoQueryRequest {
	r.rawRequestMap = rawMap
	return r
}

// GetRawMap 获取原始请求映射数据
func (r *MerchChannelInfoQueryRequest) GetRawMap() (map[string]interface{}, bool) {
	return r.rawRequestMap, len(r.rawRequestMap) > 0
}

// ToMap 转换为map
func (r *MerchChannelInfoQueryRequest) ToMap() (map[string]interface{}, error) {
	// 如果有原始请求数据，优先使用
	if rawMap, hasRaw := r.GetRawMap(); hasRaw {
		return rawMap, nil
	}

	// 先获取基类的map
	baseMap, err := r.OrgBaseRequest.ToMap()
	if err != nil {
		return nil, err
	}

	// 添加自己的字段
	if r.MerchNo != "" {
		baseMap["merch_no"] = r.MerchNo
	}

	return baseMap, nil
}

// CheckRequiredParams 检查必需参数
func (r *MerchChannelInfoQueryRequest) CheckRequiredParams(config *core.Config) error {
	// 与Python版本保持一致，不进行参数校验
	return nil
}

// MerchChannelInfoQueryResponse 商户渠道信息查询响应
type MerchChannelInfoQueryResponse struct {
	models.StandardResponse
	// MerchNo 商户号
	MerchNo string `json:"merch_no,omitempty"`
	// ChannelInfo 渠道信息
	ChannelInfo []map[string]interface{} `json:"channel_info,omitempty"`
}

// NewMerchChannelInfoQueryResponse 创建商户渠道信息查询响应
func NewMerchChannelInfoQueryResponse() *MerchChannelInfoQueryResponse {
	return &MerchChannelInfoQueryResponse{
		ChannelInfo: make([]map[string]interface{}, 0),
	}
}

// ==================== 商户主结算卡查询 ====================

// MerchMasterSettCardQueryRequest 商户主结算卡查询请求
type MerchMasterSettCardQueryRequest struct {
	models.OrgBaseRequest
	// MerchNo 商户号
	MerchNo string `json:"merch_no,omitempty"`
	// 原始请求映射数据
	rawRequestMap map[string]interface{} `json:"-"`
}

// NewMerchMasterSettCardQueryRequest 创建商户主结算卡查询请求
func NewMerchMasterSettCardQueryRequest() *MerchMasterSettCardQueryRequest {
	req := &MerchMasterSettCardQueryRequest{}
	return req
}

// SetMerchNo 设置商户号
func (r *MerchMasterSettCardQueryRequest) SetMerchNo(merchNo string) *MerchMasterSettCardQueryRequest {
	r.MerchNo = merchNo
	return r
}

// SetRawRequestMap 设置原始请求映射数据
func (r *MerchMasterSettCardQueryRequest) SetRawRequestMap(rawMap map[string]interface{}) *MerchMasterSettCardQueryRequest {
	r.rawRequestMap = rawMap
	return r
}

// GetRawMap 获取原始请求映射数据
func (r *MerchMasterSettCardQueryRequest) GetRawMap() (map[string]interface{}, bool) {
	return r.rawRequestMap, len(r.rawRequestMap) > 0
}

// ToMap 转换为map
func (r *MerchMasterSettCardQueryRequest) ToMap() (map[string]interface{}, error) {
	// 如果有原始请求数据，优先使用
	if rawMap, hasRaw := r.GetRawMap(); hasRaw {
		return rawMap, nil
	}

	// 先获取基类的map
	baseMap, err := r.OrgBaseRequest.ToMap()
	if err != nil {
		return nil, err
	}

	// 添加自己的字段
	if r.MerchNo != "" {
		baseMap["merch_no"] = r.MerchNo
	}

	return baseMap, nil
}

// CheckRequiredParams 检查必需参数
func (r *MerchMasterSettCardQueryRequest) CheckRequiredParams(config *core.Config) error {
	// 与Python版本保持一致，不进行参数校验
	return nil
}

// MerchMasterSettCardQueryResponse 商户主结算卡查询响应
type MerchMasterSettCardQueryResponse struct {
	models.StandardResponse
	// MerchNo 商户号
	MerchNo string `json:"merch_no,omitempty"`
	// MerchName 商户名称
	MerchName string `json:"merch_name,omitempty"`
	// SettleType 结算类型
	SettleType string `json:"settle_type,omitempty"`
	// AccountName 户名 (需要解密)
	AccountName string `json:"account_name,omitempty"`
	// AccountNo 账号 (需要解密)
	AccountNo string `json:"account_no,omitempty"`
	// BankCode 开户银行编码
	BankCode string `json:"bank_code,omitempty"`
	// BankBranchID 开户支行编号
	BankBranchID string `json:"bank_branch_id,omitempty"`
	// BankBranchName 开户支行名称
	BankBranchName string `json:"bank_branch_name,omitempty"`
	// 敏感字段列表（用于解密）
	sensitiveFields []string `json:"-"`
	// 原始响应数据
	rawData map[string]interface{} `json:"-"`
}

// NewMerchMasterSettCardQueryResponse 创建商户主结算卡查询响应
func NewMerchMasterSettCardQueryResponse() *MerchMasterSettCardQueryResponse {
	return &MerchMasterSettCardQueryResponse{
		// 初始化敏感字段列表（使用结构体字段名）
		sensitiveFields: []string{
			"AccountName", // 户名
			"AccountNo",   // 账号
		},
	}
}

// GetSensitiveFields 获取敏感字段列表
func (r *MerchMasterSettCardQueryResponse) GetSensitiveFields() []string {
	return r.sensitiveFields
}

// SetSensitiveFields 设置敏感字段列表
func (r *MerchMasterSettCardQueryResponse) SetSensitiveFields(fields []string) {
	r.sensitiveFields = fields
}

// GetRawData 获取原始响应数据
func (r *MerchMasterSettCardQueryResponse) GetRawData() map[string]interface{} {
	return r.rawData
}

// SetRawData 设置原始响应数据
func (r *MerchMasterSettCardQueryResponse) SetRawData(rawData map[string]interface{}) {
	r.rawData = rawData
}
